package com.server.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.junit.Test;

import java.security.MessageDigest;

/**
 * MD5加密工具类
 *
 * @author JJ
 */
public class MD5Utils {

	/**
	 * 32位md5
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public final static String md5Encode(String str) throws Exception {
		try {
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(str.getBytes("GBK")); // 问题主要出在这里，Java的字符串是unicode编码，不受源码文件的编码影响；而PHP的编码是和源码文件的编码一致，受源码编码影响。
			StringBuffer buf = new StringBuffer();
			for (byte b : md5.digest()) {
				buf.append(String.format("%02x", b & 0xff));
			}
			return buf.toString();
		} catch (Exception e) {
			//	LogUtils.getFrameworkLoger().error(e);
			return null;
		}
	}

	/**
	 * 16位md5
	 *
	 * @param str
	 * @return
	 * @throws Exception
	 */
	public final static String md5Encode_16(String str) throws Exception {
		String md5_32 = md5Encode(str);
		String md5_16 = "";
		if (StringUtils.isNotEmpty(md5_32)) {
			md5_16 = md5_32.substring(8, 24);
		}
		return md5_16;
	}

	public final static String getMd5Password(String str,String salt) throws Exception {
		return MD5Utils.getMd5CodeWithExtracode(str, salt,
				ConstantUtils.MD5_ENCODE_TYPE_RIGHT);
	}

	@Test
	public void fun() throws Exception {
		System.out.println(getMd5Password("123456","123456"));
	}

	/**
	 * 根据附加码及连接方式取md5
	 *
	 * @param str        待加密原文
	 * @param extracode  附加码
	 * @param appendType 连接方式
	 * @return
	 * @throws Exception
	 */
	public final static String getMd5CodeWithExtracode(String str,
													   String extracode, String appendType) throws Exception {
		String code = "";
		if (appendType.equals(ConstantUtils.MD5_ENCODE_TYPE_LEFT)) {
			code = MD5Utils.md5Encode(MD5Utils.md5Encode(extracode)
					+ MD5Utils.md5Encode(str));
		} else {
			// default == right
			code = MD5Utils.md5Encode(MD5Utils.md5Encode(str)
					+ MD5Utils.md5Encode(extracode));
		}
		return code;
	}
	@Test
	public void testMd5() throws Exception {
	    String md5 = MD5Utils.md5Encode("123456");
		System.out.println(md5);
	}
}
